import { fromUnixTime, intlFormat, parseISO } from "date-fns";

const isUnixTimestamp = (value: unknown): boolean => {
	if (typeof value !== "number" && typeof value !== "string") return false;
	const num = Number(value);
	if (!Number.isFinite(num)) return false;
	// Check plausible Unix timestamp range: from 1970 to ~year 3000
	// Support both seconds and milliseconds
	if (num > 0 && num < 10000000000) return true; // seconds (<= 10 digits)
	if (num >= 10000000000 && num < 32503680000000) return true; // milliseconds (<= 13 digits)
	return false;
};

const parseDate = (value: string | number): Date | null => {
	if (typeof value !== "number" && typeof value !== "string") return null;
	try {
		return isUnixTimestamp(value) ? fromUnixTime(+value) : parseISO(`${value}`);
	} catch {
		return null;
	}
};

const formatDateTime = (value: string | number): string => {
	const d = parseDate(value);
	if (!d) return `${value}`;
	try {
		return intlFormat(d, {
			weekday: "long",
			year: "numeric",
			month: "numeric",
			day: "numeric",
			hour: "numeric",
			minute: "numeric",
			second: "numeric",
			hour12: true,
		});
	} catch {
		return `${value}`;
	}
};

export { formatDateTime, parseDate, isUnixTimestamp };
